package validator

import (
	"fmt"
	"ginblog/utils/errmsg"
	"github.com/go-playground/locales/zh_Hans_CN"
	unTrans "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

// Validate 数据验证模块
// 该函数使用GoPlayground的validator库来验证传入的数据是否符合规范
// 它还使用了翻译器来将验证错误消息翻译成中文
// 参数:
//
//	data any: 待验证的数据，可以是任何结构体
//
// 返回值:
//
//	string: 如果验证失败，返回错误信息；如果成功，返回空字符串
//	int: 错误代码，使用errmsg包中定义的常量
func Validate(data any) (string, int) {
	// 创建一个新的验证器实例
	validate := validator.New()
	// 创建一个通用翻译器实例，用于中文翻译
	uni := unTrans.New(zh_Hans_CN.New())
	trans, _ := uni.GetTranslator("zh_Hans_CN")

	// 注册默认的中文翻译
	err := zhTrans.RegisterDefaultTranslations(validate, trans)
	if err != nil {
		fmt.Println("err:", err)
	}
	// 注册一个函数来获取结构体字段的label标签，用于错误信息中
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})

	// 验证传入的数据结构
	err = validate.Struct(data)
	if err != nil {
		// 如果验证失败，遍历错误并返回第一个错误的翻译信息
		for _, v := range err.(validator.ValidationErrors) {
			return v.Translate(trans), errmsg.ERROR
		}
	}
	// 如果验证成功，返回空字符串和成功错误码
	return "", errmsg.SUCCESS
}
